import {
	local,
	dev,
	prod
} from "./env.js";

// 发布时，记得同时修改baseUrl
// local 本地
// dev 测试
// prod 正式
const baseUrl = local.baseUrl;

import {
	getToken,
	setToken,
	removeToken,
	clearStorage
} from "./localStorage.js";

const statusMessage = {
	200: "服务器成功返回请求的数据。",
	201: "新建或修改数据成功。",
	202: "一个请求已经进入后台排队（异步任务）。",
	204: "删除数据成功。",
	400: "发出的请求有错误，服务器没有进行新建或修改数据的操作。",
	401: "用户没有权限（令牌、用户名、密码错误）。",
	403: "用户得到授权，但是访问是被禁止的。",
	404: "发出的请求针对的是不存在的记录，服务器没有进行操作。",
	405: "请求方法不被允许。",
	406: "请求的格式不可得。",
	410: "请求的资源被永久删除，且不会再得到的。",
	422: "当创建一个对象时，发生一个验证错误。",
	429: "请求太频繁，请1分钟后再试！",
	500: "服务器发生错误，请检查服务器。",
	502: "网关错误。",
	503: "服务不可用，服务器暂时过载或维护。",
	504: "网关超时。",
};

// 基础配置
const baseConfig = {
	baseURL: baseUrl, // 接口基础地址（根据实际项目修改）
	timeout: 10000, // 请求超时时间（毫秒）
};

/**
 * 前置拦截器（发起请求之前的拦截）
 * @param {Object} config - 请求配置
 * @returns {Object} 处理后的配置
 */
const requestInterceptor = (config) => {
	config.url = baseConfig.baseURL + config.url;

	if (getToken()) {
		config.header["Cookie"] = getToken();
	}

	return config;
};

/**
 * 后置拦截器（获取到响应时的拦截）
 * @param {Object} res - 响应数据
 * @param {String} url - 接口地址
 * @returns {Promise} 处理后的响应
 */
const responseInterceptor = (res, url) => {
	const {
		statusCode
	} = res;

	// 不报错白名单
	const whiteList = ["/tx-store-api/employees/email"];
	const whiteFlag = false;
	for (const item of whiteList) {
		if (url.indexOf(item) != -1) {
			// url属于白名单
			whiteFlag = true;
			break;
		}
	}

	if (statusCode === 200) {
		return Promise.resolve(res.data)
	} else {
		return Promise.reject({
			...res,
			whiteFlag
		})
	}
};

/**
 * 错误处理
 * @param {Error} e - 错误信息
 */
const errorHandler = (e) => {
	const {
		statusCode,
		whiteFlag
	} = e;

	// 是否属于白名单（不属于白名单，显示提示）
	if (!whiteFlag) {
		if (statusMessage[statusCode]) {
			// 有错误码
			if (statusCode == 401) {
				uni.showToast({
					title: statusMessage[statusCode],
					icon: "none",
					mask: true,
					duration: 3000
				});
			} else {
				uni.showToast({
					title: `CODE  ${statusCode}: ${e?.response?.data?.error_description ? e?.response?.data?.error_description : statusMessage[statusCode]}`,
					icon: "none",
					mask: true,
					duration: 3000
				});
			}
		} else {
			// 无错误码
			uni.showToast({
				title: `CODE ${statusCode}: ${e?.response?.data?.error_description ? e?.response?.data?.error_description : "未知错误，请重试！"}`,
				icon: "none",
				mask: true,
				duration: 3000
			});
		}
	}

	return Promise.reject(e);
};

/**
 * 核心请求函数
 * @param {Object} options - 请求参数
 * @returns {Promise} 请求结果
 */
const request = (options) => {
	const config = {
		...baseConfig,
		...options,
		header: {
			...baseConfig.header,
			...options.header
		}
	}

	// 执行请求拦截
	const processedConfig = requestInterceptor(config)

	// 发起请求
	return new Promise((resolve, reject) => {
		uni.request({
			...processedConfig,
			success: (res) => {
				// 响应拦截处理
				responseInterceptor(res, options.url)
					// 接口正常执行
					.then(resolve)
					// 接口报错
					.catch(reject)
			},
			fail: (e) => {
				// 网络错误处理
				reject(new Error(e));
			},
			complete: () => {
				// 可添加请求完成后的统一逻辑（如关闭加载中动画）
			}
		})
	}).catch(errorHandler);
};

export const myRequest = (url, method, data = {}, config = {
	header: {}
}) => {
	return request({
		url,
		method,
		data,
		...config,
	})
};

export const myRequestAsync = async (url, method, data = {}, config = {
	header: {}
}) => {
	try {
		return await request({
			url,
			method,
			data,
			...config,
		})
	} catch (e) {
		return false;
	}
};